package com.cs.beneficios.business.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import com.cs.beneficios.business.model.BeneficiarioVO;
import com.cs.beneficios.business.model.BeneficioVO;
import com.cs.beneficios.common.ConnectionFactory;
import com.cs.beneficios.common.util.Utility;

/**
 * DAO para crear, consultar y actualizar registros en la tabla Beneficiarios.
 * 
 * @author Carlos.Ruiz@consultsoft.com
 * @version 1.0
 */

public class BeneficiarioDAO extends BaseDAO {

	private final String SELECT_ALL_SISBEN = "SELECT * FROM TCS_BEN_SISBEN3_NEW_2012 WHERE 1=1 ";

	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public BeneficiarioDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	/**
	 * TABLA TCS_BEN_BENEFICIARIO
	 */

	public Collection findBeneficiarioMEL(BeneficiarioVO criterea)
			throws SQLException {
		String strSQL = "SELECT * FROM VCS_BEN_CAMPOS_MEL WHERE 'a'='a' ";
		if (criterea.getTipoDocumento() != null
				&& !criterea.getTipoDocumento().equalsIgnoreCase("")) {
			strSQL += " AND TIPODOCUMENTO = '" + criterea.getTipoDocumento()
					+ "' ";
		}
		if (criterea.getNumeroDocumento() != null
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")) {
			strSQL += " AND NUMERODOCUMENTO = '"
					+ criterea.getNumeroDocumento().trim() + "' ";
		}
		if (criterea.getNombre1() != null
				&& !criterea.getNombre1().equalsIgnoreCase("")) {
			strSQL += " AND NOMBRE1 = UPPER('" + criterea.getNombre1().trim()
					+ "') ";
		}
		if (criterea.getNombre2() != null
				&& !criterea.getNombre2().equalsIgnoreCase("")) {
			strSQL += " AND NOMBRE2 = UPPER('" + criterea.getNombre2().trim()
					+ "') ";
		}
		if (criterea.getPrimerApellido() != null
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")) {
			strSQL += " AND APELLIDO1 = UPPER('"
					+ criterea.getPrimerApellido().trim() + "') ";
		}
		if (criterea.getSegundoApellido() != null
				&& !criterea.getSegundoApellido().equalsIgnoreCase("")) {
			strSQL += " AND APELLIDO2 = UPPER('"
					+ criterea.getSegundoApellido().trim() + "') ";
		}
		if (criterea.getFechaNacimiento() != null
				&& !criterea.getFechaNacimiento().equalsIgnoreCase("")) {
			strSQL += " AND FECHANACIMIENTO = '"
					+ criterea.getFechaNacimiento().trim() + "' ";
		}

		ResultSet rst = null;
		ArrayList beneficiarios = new ArrayList();
		// System.out.println(strSQL);
		rst = cf.getRecordsRset(strSQL, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setNumeroDocumento(rst.getString("NUMERODOCUMENTO"));
			bene.setTipoDocumento(rst.getString("TIPODOCUMENTO"));
			bene.setNombre1(rst.getString("NOMBRE1"));
			bene.setPrimerApellido(rst.getString("APELLIDO1"));
			bene.setNombre2(rst.getString("NOMBRE2"));
			bene.setSegundoApellido(rst.getString("APELLIDO2"));
			bene.setFechaNacimiento(rst.getString("FECHANACIMIENTO"));
			bene.setSexo(rst.getString("SEXO"));
			bene.setDirDescriptiva(rst.getString("direccion"));
			beneficiarios.add(bene);
			bene = null;
		}
		rst.close();
		return beneficiarios;

	}
	
	public Collection findBeneficiarioSisben(BeneficiarioVO criterea)
	throws SQLException {
		if (criterea == null) {
			throw new IllegalArgumentException("El parametro BeneficiarioVO no puede ser null");
		}
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		Collection usuarios = new ArrayList();
		StringBuffer stb = new StringBuffer();
		try {
			stb.append(SELECT_ALL_SISBEN);
			if(criterea.getNombre1() != null && !"".equalsIgnoreCase(criterea.getNombre1())){
				stb.append("AND UPPER(NOM1) = UPPER(?) ");
			}
			if(criterea.getNombre2() != null && !"".equalsIgnoreCase(criterea.getNombre2())){
				stb.append("AND UPPER(NOM2) = UPPER(?) ");
			}
			if(criterea.getPrimerApellido() != null && !"".equalsIgnoreCase(criterea.getPrimerApellido())){
				stb.append("AND UPPER(APE1) = UPPER(?) ");
			}
			if(criterea.getSegundoApellido() != null && !"".equalsIgnoreCase(criterea.getSegundoApellido())){
				stb.append("AND UPPER(APE2) = UPPER(?) ");
			}
			if(criterea.getTipoDocumento() != null && !"".equalsIgnoreCase(criterea.getTipoDocumento())){
				stb.append("AND TIPODOC = ? ");
			}
			if(criterea.getNumeroDocumento() != null && !"".equalsIgnoreCase(criterea.getNumeroDocumento())){
				stb.append("AND DOCUMENT = ? ");
			}
			if(criterea.getFechaNacimiento() != null && !"".equalsIgnoreCase(criterea.getFechaNacimiento())){
				stb.append("AND to_date(FECHANTO,'dd/mm/rrrr') = to_date(?,'dd/mm/rrrr') ");
			}
			//PRECOMPILA LA SENTENCIA SQL
			preparedStatement = conn.prepareStatement(stb.toString());
			//ADICIONA LOS PARAMETROS, EVITANDO SQL INJECTION
			int parameterIndex = 1;
			if(criterea.getNombre1() != null && !"".equalsIgnoreCase(criterea.getNombre1())){
				preparedStatement.setString(parameterIndex++, criterea.getNombre1());
			}
			if(criterea.getNombre2() != null && !"".equalsIgnoreCase(criterea.getNombre2())){
				preparedStatement.setString(parameterIndex++, criterea.getNombre2());
			}
			if(criterea.getPrimerApellido() != null && !"".equalsIgnoreCase(criterea.getPrimerApellido())){
				preparedStatement.setString(parameterIndex++, criterea.getPrimerApellido());
			}
			if(criterea.getSegundoApellido() != null && !"".equalsIgnoreCase(criterea.getSegundoApellido())){
				preparedStatement.setString(parameterIndex++, criterea.getSegundoApellido());
			}
			if(criterea.getTipoDocumento() != null && !"".equalsIgnoreCase(criterea.getTipoDocumento())){
				preparedStatement.setString(parameterIndex++, Utility.deformatSisbenDocument(criterea.getTipoDocumento()));
			}
			if(criterea.getNumeroDocumento() != null && !"".equalsIgnoreCase(criterea.getNumeroDocumento())){
				preparedStatement.setString(parameterIndex++, criterea.getNumeroDocumento());
			}
			if(criterea.getFechaNacimiento() != null && !"".equalsIgnoreCase(criterea.getFechaNacimiento())){
				preparedStatement.setString(parameterIndex++, criterea.getFechaNacimiento());
			}
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				BeneficiarioVO benvo = mapSisben(resultSet);
				Utility.formatSisben(benvo);
				usuarios.add(benvo);
			}
		} catch (SQLException e) {
		} finally {
			close(preparedStatement);
			close(resultSet);
		}
		return usuarios;
	}

	public Collection findBeneficiarioSisben3(BeneficiarioVO criterea)
			throws SQLException {
		boolean noCriteriosDiponibles = false;
		String query = "SELECT * FROM VCS_BEN_CAMPOS_SISBEN ";
		if (criterea.getTipoDocumento() != null
				&& criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getNombre2() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& !criterea.getTipoDocumento().equalsIgnoreCase("")
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& !criterea.getNombre1().equalsIgnoreCase("")
				&& !criterea.getNombre2().equalsIgnoreCase("")
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")
				&& !criterea.getSegundoApellido().equalsIgnoreCase("")
				&& !criterea.getFechaNacimiento().equalsIgnoreCase("")) {
			query += " WHERE TIPO_DOCUMENTO = '" + criterea.getTipoDocumento()
					+ "' " + " AND NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento().trim() + "'"
					+ " AND UPPER(NOMBRE1) = '"
					+ criterea.getNombre1().toUpperCase().trim() + "'"
					+ " AND UPPER(NOMBRE2) = '"
					+ criterea.getNombre2().toUpperCase().trim() + "'"
					+ " AND UPPER(APELLIDO1) = '"
					+ criterea.getPrimerApellido().toUpperCase().trim() + "'"
					+ " AND UPPER(APELLIDO2) = '"
					+ criterea.getSegundoApellido().toUpperCase().trim() + "'"
					+ " AND TO_DATE(FECHA_NACIMIENTO,'DD/MM/RRRR') = TO_DATE('"
					+ criterea.getFechaNacimiento() + "','DD/MM/RRRR')";
		} else if (criterea.getNombre1() != null
				&& criterea.getNombre2() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& criterea.getTipoDocumento() != null
				&& criterea.getNumeroDocumento() != null
				&& !criterea.getNombre1().equalsIgnoreCase("")
				&& !criterea.getNombre2().equalsIgnoreCase("")
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")
				&& !criterea.getSegundoApellido().equalsIgnoreCase("")
				&& !criterea.getFechaNacimiento().equalsIgnoreCase("")
				&& criterea.getTipoDocumento().equalsIgnoreCase("")
				&& criterea.getNumeroDocumento().equalsIgnoreCase("")) {
			query += " WHERE UPPER(NOMBRE1) = '"
					+ criterea.getNombre1().toUpperCase() + "'"
					+ " AND UPPER(NOMBRE2) = '"
					+ criterea.getNombre2().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO1) = '"
					+ criterea.getPrimerApellido().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO2) = '"
					+ criterea.getSegundoApellido().toUpperCase() + "'"
					+ " AND TO_DATE(FECHA_NACIMIENTO,'DD/MM/RRRR') = TO_DATE('"
					+ criterea.getFechaNacimiento() + "','DD/MM/RRRR')";
		} else if (criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getNombre2() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getTipoDocumento() != null
				&& criterea.getFechaNacimiento() != null
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& !criterea.getNombre1().equalsIgnoreCase("")
				&& !criterea.getNombre2().equalsIgnoreCase("")
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")
				&& !criterea.getSegundoApellido().equalsIgnoreCase("")
				&& criterea.getTipoDocumento().equalsIgnoreCase("")
				&& criterea.getFechaNacimiento().equalsIgnoreCase("")) {
			query += " WHERE NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'"
					+ " AND UPPER(NOMBRE1) = '"
					+ criterea.getNombre1().toUpperCase() + "'"
					+ " AND UPPER(NOMBRE2) = '"
					+ criterea.getNombre2().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO1) = '"
					+ criterea.getPrimerApellido().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO2) = '"
					+ criterea.getSegundoApellido().toUpperCase() + "'";
		} else if (criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& criterea.getNombre2() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getTipoDocumento() != null
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& !criterea.getNombre1().equalsIgnoreCase("")
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")
				&& !criterea.getFechaNacimiento().equalsIgnoreCase("")
				&& criterea.getNombre2().equalsIgnoreCase("")
				&& criterea.getSegundoApellido().equalsIgnoreCase("")
				&& criterea.getTipoDocumento().equalsIgnoreCase("")) {
			query += " WHERE NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'"
					+ " AND UPPER(NOMBRE1) = '"
					+ criterea.getNombre1().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO1) = '"
					+ criterea.getPrimerApellido().toUpperCase() + "'"
					+ " AND TO_DATE(FECHA_NACIMIENTO,'DD/MM/RRRR') = TO_DATE('"
					+ criterea.getFechaNacimiento() + "','DD/MM/RRRR')";
		} else if (criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& criterea.getNombre2() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getTipoDocumento() != null
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& !criterea.getNombre1().equalsIgnoreCase("")
				&& !criterea.getPrimerApellido().equalsIgnoreCase("")
				&& criterea.getTipoDocumento().equalsIgnoreCase("")
				&& criterea.getNombre2().equalsIgnoreCase("")
				&& criterea.getSegundoApellido().equalsIgnoreCase("")
				&& criterea.getFechaNacimiento().equalsIgnoreCase("")) {
			query += " WHERE NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'"
					+ " AND UPPER(NOMBRE1) = '"
					+ criterea.getNombre1().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO1) = '"
					+ criterea.getPrimerApellido().toUpperCase() + "'";
		} else if (criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& criterea.getNombre2() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getTipoDocumento() != null
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& !criterea.getNombre2().equalsIgnoreCase("")
				&& !criterea.getSegundoApellido().equalsIgnoreCase("")
				&& !criterea.getFechaNacimiento().equalsIgnoreCase("")
				&& criterea.getTipoDocumento().equalsIgnoreCase("")
				&& criterea.getNombre1().equalsIgnoreCase("")
				&& criterea.getNombre2().equalsIgnoreCase("")) {
			query += " WHERE NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'"
					+ " AND UPPER(NOMBRE2) = '"
					+ criterea.getNombre2().toUpperCase() + "'"
					+ " AND UPPER(APELLIDO2) = '"
					+ criterea.getSegundoApellido().toUpperCase() + "'"
					+ " AND TO_DATE(FECHA_NACIMIENTO,'DD/MM/RRRR') = TO_DATE('"
					+ criterea.getFechaNacimiento() + "','DD/MM/RRRR')";
		} else if (criterea.getNumeroDocumento() != null
				&& criterea.getNombre1() != null
				&& criterea.getPrimerApellido() != null
				&& criterea.getFechaNacimiento() != null
				&& criterea.getNombre2() != null
				&& criterea.getSegundoApellido() != null
				&& criterea.getTipoDocumento() != null
				&& !criterea.getTipoDocumento().equalsIgnoreCase("")
				&& !criterea.getNumeroDocumento().equalsIgnoreCase("")
				&& criterea.getNombre1().equalsIgnoreCase("")
				&& criterea.getNombre2().equalsIgnoreCase("")
				&& criterea.getPrimerApellido().equalsIgnoreCase("")
				&& criterea.getSegundoApellido().equalsIgnoreCase("")
				&& criterea.getFechaNacimiento().equalsIgnoreCase("")) {
			query += " WHERE TIPO_DOCUMENTO = '" + criterea.getTipoDocumento()
					+ "' " + " AND NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'";
		} else {
			noCriteriosDiponibles = true;
		}
		if (noCriteriosDiponibles) {
			return null;
		}

		ResultSet rst = null;
		ArrayList beneficiarios = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
			bene.setTipoDocumento(rst.getString("TIPO_DOCUMENTO"));
			bene.setNombre1(rst.getString("NOMBRE1"));
			bene.setPrimerApellido(rst.getString("APELLIDO1"));
			bene.setNombre2(rst.getString("NOMBRE2"));
			bene.setSegundoApellido(rst.getString("APELLIDO2"));
			bene.setFechaNacimiento(rst.getString("FECHA_NACIMIENTO"));
			bene.setSexo(rst.getString("SEXO"));
			bene.setGrupoFamiliar(rst.getString("FICHA"));
			bene.setNivelSisben(rst.getString("NIVEL_SISBEN"));
			bene.setPuntajeSisben(rst.getString("PUNTAJE"));
			bene.setFichaSisben(rst.getString("FICHA"));
			bene.setHogar(rst.getString("HOGAR"));
			String retorno[] = getBeneficiosSisben(bene.getNumeroDocumento(),
					bene.getTipoDocumento());
			bene.setPoseeBeneficios(retorno[0]);
			if (!retorno[1].equals("nulo"))
				bene.setCode(new Long(retorno[1]));
			else
				bene.setCode(new Long(0));
			beneficiarios.add(bene);
			bene = null;
		}
		rst.close();
		return beneficiarios;
	}
	
	/**
	 * Obtiene el grupo familiar de un integrante del sistema SISBEN3, a partir
	 * de su tipo y numero de documento, estos valores deben ser numericos que
	 * es como estan registrados en el SISBEN, pero se envian como un String.
	 * 
	 * @param documentType
	 *            tipo de documento del integrante del grupo familiar.
	 * 
	 * @param documentNumber
	 *            numero de documento del integrante del grupo familiar.
	 * 
	 * @return List con las personas que pertenecen al grupo familiar.
	 * 
	 * @throws SQLException
	 *             Si falla la ejecucion del query por tipos de parametros o
	 *             problemas en la base de datos
	 * 
	 * @throws SUBException
	 *             Por la falla en alguna conexion con el API.
	 */
	public Collection getGrupoFamiliarSisben(String ficha, String hogar){
		// Variables locales
		ResultSet result = null;
		PreparedStatement stmt = null;
		List familia = new ArrayList(0);
		String[] jefeHogar = null;
		// Query
		StringBuffer query = new StringBuffer(256);
		query.append("SELECT TIPODOC, " + "DOCUMENT, " + "NOM1, " + "NOM2, "
				+ "APE1, " + "APE2, " + "SEXO, " + "TELES, " + "DIRECC, "
				+ "BARRIO, " + "TO_CHAR(FECHANTO,'DD/MM/YYYY') AS FECHA, "
				+ "ZONA, " + "COMUNA, " + "ESTCIVIL, " + "CARNET, "
				+ "PUNTAJE, " + "FICHA, "
				+ "TO_CHAR(FECHAINGRE,'DD/MM/YYYY') AS FECHAINGRE, "
				+ "TO_CHAR(FECHAMODP,'DD/MM/YYYY') AS FECHAMODP, "
				+ "PARENTES, " + "TPERSONA, " + "HOGAR, " + "THOGAR, "
				+ "ORDEN, " + "ASISTE, " + "TIPOESTA, " + "GRADO, " + "NIVEL, "
				+ "NPARENTES, " + "JEFEUG, " + "NOMBARRIO, " + "VEREDA, "
				+ "NOMVEREDA, " + "UNIGASTO FROM TCS_BEN_SISBEN3_NEW_2012 WHERE FICHA = ? AND HOGAR = ? ORDER BY parentes ");
		// Proceso de Validacion
		try {
			// Prepara el query para compilarla y ejecutarla despues de
			// agregarle los parametros
			stmt = conn.prepareStatement(query.toString());
			stmt.setString(1, ficha);
			stmt.setString(2, hogar);
			result = stmt.executeQuery();
			while (result.next()) {
				BeneficiarioVO bene = new BeneficiarioVO();
				bene.setNumeroDocumento(result.getString("DOCUMENT"));
				bene.setTipoDocumento(result.getString("TIPODOC"));
				bene.setNombre1(result.getString("NOM1"));
				bene.setPrimerApellido(result.getString("APE1"));
				bene.setNombre2(result.getString("NOM2"));
				bene.setSegundoApellido(result.getString("APE2"));
				bene.setFechaNacimiento(result.getString("FECHA_NACIMIENTO"));
				bene.setSexo(result.getString("SEXO"));
				bene.setParentesco(result.getString("PARENTES"));
				bene.setGrupoFamiliar(result.getString("FICHA"));
				bene.setHogar(result.getString("HOGAR"));
				bene.setPoseeBeneficios(getNumberBeneficiosSisben(
						bene.getNumeroDocumento(), bene.getTipoDocumento()));
				// Obtiene el tipo y numero de documento del jefe de hogar.
				// Evita el
				// tener que hacer la consulta por cada integrante
				if (jefeHogar == null) {
					jefeHogar = this.getDocumentoJefeHogar(bene.getFichaSisben(),
							bene.getHogar());
				}
				bene.setDocumentoCabezaGF(jefeHogar[1]);
				//Formatea el parentesco
				Utility.formatSisbenParentesco(bene);
				familia.add(bene);
				bene = null;
			}
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		} finally {
			close(result);
			close(stmt);
		}
		return familia;
	}
	
	/**
	 * Obtiene el tipo y numero de documento del jefe de hogar, a partir de la
	 * ficha y hogar que se manden como parametros. Si la busqueda arroja
	 * resultados devuelve un array de String con 2 posiciones para el tipo y el
	 * numero. Estos valores son devueltos seguidos por la tipificacion del
	 * SISBEN 3, es decir, el tipo de documento es un valor numerico. Ej tipo 1,
	 * 2.. Ya que estos son los valores con los que se busca en la base de datos
	 * de este sistema.
	 * 
	 * @param ficha
	 *            Numero de la ficha del sisben, tipo String.
	 * 
	 * @param hogar
	 *            Numero del hogar que esta dentro de la ficha, tipo String.
	 * 
	 * @return Array con los tipo y numero de documento si lo encuentra.
	 * 
	 * @throws SQLException
	 *             Se lanza la excepcion si no se encuentra un jefe de hogar
	 *             para esa ficha y hogar.
	 * @throws SUBException
	 *             Si hay problemas para obtener la conexion a la base de datos
	 */
	public String[] getDocumentoJefeHogar(String ficha, String hogar){
		// Variables locales
		ResultSet result = null;
		PreparedStatement stmt = null;
		String[] cedula = new String[2];
		// Query
		StringBuffer query = new StringBuffer(256);
		query.append("SELECT tipodoc, document FROM ");
		query.append("TCS_BEN_SISBEN3_NEW_2012 ");
		query.append("WHERE ficha = ? ");
		query.append("AND hogar = ? ");
		query.append("AND orden = 1 ");
		try {
			// Precompila la query y la ejecuta
			stmt = conn.prepareStatement(query.toString());
			stmt.setString(1, ficha);
			stmt.setString(2, hogar);
			result = stmt.executeQuery();
			if (result.next()) {
				cedula[0] = result.getString("tipodoc");
				cedula[1] = result.getString("document");
			}
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		} finally {
			close(result);
			close(stmt);
		} // fin finaly
		return cedula;
	} // fin getDocumento jefe de hogar

	public Collection getGrupoFamiliarSisbenDos(String ficha, String hogar)
			throws SQLException {
		String query = "select * from VCS_BEN_CAMPOS_SISBEN where ficha = '"
				+ ficha + "' and hogar = '" + hogar + "'";

		ResultSet rst = null;
		ArrayList familiares = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
			bene.setTipoDocumento(rst.getString("TIPO_DOCUMENTO"));
			bene.setNombre1(rst.getString("NOMBRE1"));
			bene.setPrimerApellido(rst.getString("APELLIDO1"));
			bene.setNombre2(rst.getString("NOMBRE2"));
			bene.setSegundoApellido(rst.getString("APELLIDO2"));
			bene.setFechaNacimiento(rst.getString("FECHA_NACIMIENTO"));
			bene.setSexo(rst.getString("SEXO"));
			bene.setParentesco(rst.getString("PARENTESCO"));
			bene.setGrupoFamiliar(rst.getString("FICHA"));
			bene.setHogar(rst.getString("HOGAR"));
			bene.setPoseeBeneficios(getNumberBeneficiosSisben(
					bene.getNumeroDocumento(), bene.getTipoDocumento()));

			String retorno[] = getBeneficiosSisben(bene.getNumeroDocumento(),
					bene.getTipoDocumento());
			if (!retorno[1].equals("nulo"))
				bene.setCode(new Long(retorno[1]));
			else
				bene.setCode(new Long(0));
			String retorno1 = FindGrupoFamiliar(
					rst.getString("NUMERO_DOCUMENTO"),
					rst.getString("TIPO_DOCUMENTO"));
			if (retorno1 != null)
				bene.setDocumentoCabezaGF(retorno1);
			else
				bene.setDocumentoCabezaGF("No");
			familiares.add(bene);
			bene = null;
		}
		rst.close();
		return familiares;

	}

	public String FindGrupoFamiliar(String NumeroDocum, String TipoDocum)
			throws SQLException {
		String query = "SELECT gf.CODIGO CODEBENEGF, gf.GF_CODIGO, gf.BEN_CODIGO, bene.NUMERO_DOCUMENTO, bene.TIPO_DOCUMENTO "
				+ " FROM TCS_BEN_BENEF_GRUPO_FAMILIAR gf, TCS_BEN_BENEFICIARIO bene "
				+ " WHERE gf.BEN_CODIGO = bene.CODIGO "
				+ " AND bene.NUMERO_DOCUMENTO = '"
				+ NumeroDocum
				+ "' "
				+ " AND bene.TIPO_DOCUMENTO = '" + TipoDocum + "'";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		String strCodeGF = "No";
		if (rst.next()) {
			strCodeGF = "Si";
		}
		rst.close();
		return strCodeGF;

	}

	public Collection findBeneficiarioByCriterea(BeneficiarioVO criterea,
			String strOrigen) throws SQLException {
		String query = "SELECT bene.CODIGO CODIGOBENE, bene.NUMERO_DOCUMENTO, "
				+ "bene.TIPO_DOCUMENTO, "
				+ "UPPER(bene.PRIMER_NOMBRE) PRIMER_NOMBRE, UPPER(bene.PRIMER_APELLIDO) PRIMER_APELLIDO, "
				+ "UPPER(bene.SEGUNDO_NOMBRE) SEGUNDO_NOMBRE, UPPER(bene.SEGUNDO_APELLIDO) SEGUNDO_APELLIDO, "
				+ "TO_CHAR(bene.FECHA_NACIMIENTO,'dd/mm/rrrr') FECHA_NACIMIENTO , bene.SEXO, "
				+ "bene.TELEFONO, bene.DIRECCION_DESCRIPTIVA, "
				+ "bene.DIRECCION_ENCASILLADA, bene.LOCALIZACION_COBAMA, "
				+ "bgf.GF_CODIGO GF, gf.NOMBRE NOMBRE_GF, "
				+ "vflexComuna.CODIGO COMUNA, vflexZona.CODIGO COD_ZONA, "
				+ "vflexZona.DESCRIPCION DESC_ZONA, vflexBarrio.CODIGO COD_BARRIO, "
				+ "vflexBarrio.DESCRIPCION DESC_BARRIO, bene.ETNIA, bene.CORREO_ELECTRONICO mail "
				+ "FROM TCS_BEN_BENEFICIARIO bene,paoyer.TCS_VALOR_FLEXIBLE vflexComuna, "
				+ "TCS_BEN_BENEF_GRUPO_FAMILIAR bgf, TCS_BEN_GRUPO_FAMILIAR gf, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflexZona, paoyer.TCS_VALOR_FLEXIBLE vflexBarrio "
				+ "WHERE vflexComuna.CODIGO (+)= bene.VFL_CODIGO_COMUNA "
				+ "AND vflexZona.CODIGO (+)= bene.VFL_CODIGO_ZONA  "
				+ "AND vflexBarrio.CODIGO (+) = bene.VFL_CODIGO_BARRIO "
				+ "AND bgf.BEN_CODIGO (+)= bene.CODIGO "
				+ "AND gf.CODIGO (+)= bgf.GF_CODIGO ";

		if (!strOrigen.equals("ingresarBeneficiario")) {
			query += "AND bene.CAMPO_A1 IS NULL ";
		}
		if (criterea.getCode() != null) {
			query += "AND bene.CODIGO = " + criterea.getCode() + " ";
		}
		if (!(criterea.getNumeroDocumento().trim()).equalsIgnoreCase("")) {
			query += "AND bene.NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento().trim() + "' ";
		}
		if (!criterea.getTipoDocumento().equalsIgnoreCase("")) {
			query += "AND bene.TIPO_DOCUMENTO = '"
					+ criterea.getTipoDocumento() + "' ";
		}
		if (!(criterea.getNombre1().trim()).equalsIgnoreCase("")) {
			query += "AND UPPER(bene.PRIMER_NOMBRE) = UPPER('"
					+ criterea.getNombre1().trim() + "') ";
		}
		if (criterea.getNombre2() != null
				&& !(criterea.getNombre2()).trim().equalsIgnoreCase("")) {
			query += "AND UPPER(bene.SEGUNDO_NOMBRE) = UPPER('"
					+ criterea.getNombre2().trim() + "') ";
		}
		if (!criterea.getPrimerApellido().equalsIgnoreCase("")) {
			query += "AND UPPER(primer_apellido) = UPPER('"
					+ criterea.getPrimerApellido().trim() + "') ";
		}
		if (criterea.getSegundoApellido() != null
				&& !(criterea.getSegundoApellido()).trim().equalsIgnoreCase("")) {
			query += "AND UPPER(segundo_apellido) = UPPER('"
					+ criterea.getSegundoApellido().trim() + "') ";
		}
		if (criterea.getFechaNacimiento() != null) {
			if (!(criterea.getFechaNacimiento().trim()).equalsIgnoreCase("")) {
				query += "AND to_date(FECHA_NACIMIENTO,'dd/mm/rrrr') = to_date('"
						+ criterea.getFechaNacimiento() + "','dd/mm/rrrr') ";
			}
		}
		query += " AND rownum <= 100 ORDER BY bene.NUMERO_DOCUMENTO";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList beneficiarios = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setCode(new Long(rst.getLong("CODIGOBENE")));
			bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
			bene.setTipoDocumento(rst.getString("TIPO_DOCUMENTO"));
			bene.setNombre1(rst.getString("PRIMER_NOMBRE"));
			bene.setPrimerApellido(rst.getString("PRIMER_APELLIDO"));
			bene.setNombre2(rst.getString("SEGUNDO_NOMBRE"));
			bene.setSegundoApellido(rst.getString("SEGUNDO_APELLIDO"));
			bene.setVflComuna(rst.getString("COMUNA"));
			bene.setFechaNacimiento(rst.getString("FECHA_NACIMIENTO"));
			bene.setSexo(rst.getString("SEXO"));
			bene.setTelefono(rst.getString("TELEFONO"));
			bene.setDirDescriptiva(rst.getString("DIRECCION_DESCRIPTIVA"));
			bene.setDirEncasillada(rst.getString("DIRECCION_ENCASILLADA"));
			bene.setCodeZona(rst.getString("COD_ZONA"));
			bene.setDescZona(rst.getString("DESC_ZONA"));
			bene.setCodeBarrio(rst.getString("COD_BARRIO"));
			bene.setDescBarrio(rst.getString("DESC_BARRIO"));
			bene.setCobama(rst.getString("LOCALIZACION_COBAMA"));
			bene.setGrupoFamiliarCode(new Long(rst.getLong("GF")));
			bene.setGrupoFamiliar(rst.getString("NOMBRE_GF"));
			bene.setPoseeBeneficios(getBeneficios(new Long(rst
					.getLong("CODIGOBENE"))));
			bene.setMail(rst.getString("MAIL"));
			bene.setEtnia(rst.getString("ETNIA"));
			beneficiarios.add(bene);
			bene = null;
		}
		rst.close();

		return beneficiarios;
	}

	public Collection findBeneficiarioByCriterea(BeneficiarioVO criterea,
			String strOrigen, String codePrograma, String codeSubprograma)
			throws SQLException {
		String query = "SELECT DISTINCT(bene.CODIGO) CODIGOBENE, bene.NUMERO_DOCUMENTO, "
				+ "decode(bene.tipo_documento, 'C', 'Cedula de ciudadania', 'E', \n"
				+ "		'Cedula de extranjeria', 'N', 'Nit', 'P', 'Pasaporte', 'R', 'Registro civil', \n"
				+ "		'T', 'Tarjeta de identidad', 'O', 'Otro', 'I', 'NIP', 'U', 'NUIP', 'S', 'NISE',\n"
				+ "		'Cabildo', bene.tipo_documento) TIPO_DOCUMENTO, "
				+ "UPPER(bene.PRIMER_NOMBRE) PRIMER_NOMBRE, UPPER(bene.PRIMER_APELLIDO) PRIMER_APELLIDO, "
				+ "UPPER(bene.SEGUNDO_NOMBRE) SEGUNDO_NOMBRE, UPPER(bene.SEGUNDO_APELLIDO) SEGUNDO_APELLIDO, "
				+ "TO_CHAR(bene.FECHA_NACIMIENTO,'dd/mm/rrrr') FECHA_NACIMIENTO , bene.SEXO, "
				+ "bene.TELEFONO, bene.DIRECCION_DESCRIPTIVA, "
				+ "bene.DIRECCION_ENCASILLADA, "
				+ "bene.LOCALIZACION_COBAMA, "
				+ "bgf.GF_CODIGO GF, gf.NOMBRE NOMBRE_GF, "
				+ "vflexComuna.CODIGO COMUNA, vflexZona.CODIGO COD_ZONA, "
				+ "vflexZona.DESCRIPCION DESC_ZONA, vflexBarrio.CODIGO COD_BARRIO, "
				+ "vflexBarrio.DESCRIPCION DESC_BARRIO, bene.ETNIA, bene.CORREO_ELECTRONICO mail, FCS_BEN_GET_NUMERO_BENEFICIOS(bene.CODIGO) CANTIDADBENEFICIOS "
				+ "FROM TCS_BEN_BENEFICIARIO bene,paoyer.TCS_VALOR_FLEXIBLE vflexComuna, "
				+ "TCS_BEN_BENEF_GRUPO_FAMILIAR bgf, TCS_BEN_GRUPO_FAMILIAR gf, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflexZona, paoyer.TCS_VALOR_FLEXIBLE vflexBarrio ";

		if (!codePrograma.equals("nulo")) {
			query += " , TCS_BEN_BENEFICIO_OTORGADO bot, TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA pro "
					+ "WHERE vflexComuna.CODIGO (+)= bene.VFL_CODIGO_COMUNA "
					+ "AND vflexZona.CODIGO (+)= bene.VFL_CODIGO_ZONA  "
					+ "AND vflexBarrio.CODIGO (+) = bene.VFL_CODIGO_BARRIO "
					+ "AND bgf.BEN_CODIGO (+)= bene.CODIGO "
					+ "AND gf.CODIGO (+)= bgf.GF_CODIGO "
					+ "AND bot.SBPR_CODIGO = sub.CODIGO "
					+ "AND pro.CODIGO = sub.PRG_CODIGO "
					+ "AND bene.CODIGO = bot.BEN_CODIGO "
					+ "AND pro.CODIGO = "
					+ codePrograma + " ";
			Object codsubpro = (Object) codeSubprograma;
			if (codsubpro != null) {
				if (!codeSubprograma.equals("nulo")) {
					query += "AND sub.CODIGO = " + codeSubprograma + " ";
				}
			}
		} else {
			query += "WHERE vflexComuna.CODIGO (+)= bene.VFL_CODIGO_COMUNA "
					+ "AND vflexZona.CODIGO (+)= bene.VFL_CODIGO_ZONA  "
					+ "AND vflexBarrio.CODIGO (+) = bene.VFL_CODIGO_BARRIO "
					+ "AND bgf.BEN_CODIGO (+)= bene.CODIGO "
					+ "AND gf.CODIGO (+)= bgf.GF_CODIGO ";
		}

		if (!strOrigen.equals("ingresarBeneficiario")) {
			query += "AND bene.CAMPO_A1 IS NULL ";
		}
		if (criterea.getCode() != null) {
			query += "AND bene.CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNumeroDocumento().equalsIgnoreCase("")) {
			query += "AND bene.NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento().trim() + "' ";
		}
		if (!criterea.getTipoDocumento().equals("nulo")) {
			query += "AND bene.TIPO_DOCUMENTO = '"
					+ criterea.getTipoDocumento() + "' ";
		}
		if (!criterea.getNombre1().equalsIgnoreCase("")) {
			query += "AND UPPER(bene.PRIMER_NOMBRE) LIKE UPPER('%"
					+ criterea.getNombre1().trim() + "%') ";
		}
		if (!criterea.getNombre2().equalsIgnoreCase("")) {
			query += "AND UPPER(bene.SEGUNDO_NOMBRE) LIKE UPPER('%"
					+ criterea.getNombre2().trim() + "%') ";
		}
		if (!criterea.getPrimerApellido().equalsIgnoreCase("")) {
			query += "AND UPPER(primer_apellido) like UPPER('%"
					+ criterea.getPrimerApellido().trim() + "%') ";
		}
		if (!criterea.getSegundoApellido().equalsIgnoreCase("")) {
			query += "AND UPPER(segundo_apellido) like UPPER('%"
					+ criterea.getSegundoApellido().trim() + "%') ";
		}
		query += " AND rownum <= 5000 ORDER BY bene.NUMERO_DOCUMENTO";
		// System.out.println(query);
		ResultSet rst = null;
		Collection beneficiarios = new LinkedList();
		Collection beneTemp = new LinkedList();
		rst = cf.getRecordsRset(query, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setCode(new Long(rst.getLong("CODIGOBENE")));
			bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
			bene.setTipoDocumento(rst.getString("TIPO_DOCUMENTO"));
			bene.setNombre1(rst.getString("PRIMER_NOMBRE"));
			bene.setPrimerApellido(rst.getString("PRIMER_APELLIDO"));
			bene.setNombre2(rst.getString("SEGUNDO_NOMBRE"));
			bene.setSegundoApellido(rst.getString("SEGUNDO_APELLIDO"));
			bene.setVflComuna(rst.getString("COMUNA"));
			bene.setFechaNacimiento(rst.getString("FECHA_NACIMIENTO"));
			bene.setSexo(rst.getString("SEXO"));
			bene.setTelefono(rst.getString("TELEFONO"));
			bene.setDirDescriptiva(rst.getString("DIRECCION_DESCRIPTIVA"));
			bene.setDirEncasillada(rst.getString("DIRECCION_ENCASILLADA"));
			bene.setCodeZona(rst.getString("COD_ZONA"));
			bene.setDescZona(rst.getString("DESC_ZONA"));
			bene.setCodeBarrio(rst.getString("COD_BARRIO"));
			bene.setDescBarrio(rst.getString("DESC_BARRIO"));
			bene.setCobama(rst.getString("LOCALIZACION_COBAMA"));
			bene.setGrupoFamiliarCode(new Long(rst.getLong("GF")));
			bene.setGrupoFamiliar(rst.getString("NOMBRE_GF"));
			// bene.setPoseeBeneficios(getNumberBeneficios(new Long(rst.getLong(
			// "CODIGOBENE"))));
			bene.setPoseeBeneficios(rst.getString("CANTIDADBENEFICIOS"));
			bene.setMail(rst.getString("MAIL"));
			bene.setEtnia(rst.getString("ETNIA"));
			beneficiarios.add(bene);
			bene = null;
		}
		if (criterea.getPoseeBeneficios().equals("Si")) {
			List benefi = (List) beneficiarios;
			Long desde = null;
			Long hasta = null;
			Long cantidadBeneficios;

			if (!criterea.getDesdeBOT().equals("")) {
				desde = new Long(criterea.getDesdeBOT());
			}
			if (!criterea.getHastaBOT().equals("")) {
				hasta = new Long(criterea.getHastaBOT());
			}

			for (int i = 0; i < beneficiarios.size(); i++) {
				bene = (BeneficiarioVO) benefi.get(i);
				if (bene.getPoseeBeneficios().equals("0")) {
					beneTemp.add(bene);
				} else if (desde != null && hasta != null) {
					cantidadBeneficios = new Long(bene.getPoseeBeneficios());
					if (cantidadBeneficios.longValue() < desde.longValue()
							|| cantidadBeneficios.longValue() > hasta
									.longValue()) {
						beneTemp.add(bene);
					}
				} else if (desde != null && hasta == null) {
					cantidadBeneficios = new Long(bene.getPoseeBeneficios());
					if (cantidadBeneficios.longValue() < desde.longValue()) {
						beneTemp.add(bene);
					}
				} else if (desde == null && hasta != null) {
					cantidadBeneficios = new Long(bene.getPoseeBeneficios());
					if (cantidadBeneficios.longValue() > hasta.longValue()) {
						beneTemp.add(bene);
					}
				}
			}
			beneficiarios.removeAll(beneTemp);
		} else if (criterea.getPoseeBeneficios().equals("No")) {
			List benefi = (List) beneficiarios;
			for (int i = 0; i < beneficiarios.size(); i++) {
				bene = (BeneficiarioVO) benefi.get(i);
				Long cantidadBeneficios = new Long(bene.getPoseeBeneficios());
				if (cantidadBeneficios.longValue() > 0) {
					beneTemp.add(bene);
				}
			}
			beneficiarios.removeAll(beneTemp);
		}
		rst.close();

		return beneficiarios;
	}

	public int actualizarBeneficiario(BeneficiarioVO criterea)
			throws SQLException {
		String query = "UPDATE TCS_BEN_BENEFICIARIO SET "
				+ "TIPO_DOCUMENTO = ?," + "NUMERO_DOCUMENTO = ?,"
				+ "PRIMER_NOMBRE = UPPER(?)," + "SEGUNDO_NOMBRE = UPPER(?),"
				+ "PRIMER_APELLIDO = UPPER(?),"
				+ "SEGUNDO_APELLIDO = UPPER(?)," + "VFL_CODIGO_COMUNA = ?,"
				+ "FECHA_NACIMIENTO = to_date(?,'dd/mm/rrrr')," + "SEXO = ?,"
				+ "TELEFONO = ?," + "DIRECCION_DESCRIPTIVA = ?,"
				+ "DIRECCION_ENCASILLADA = ?," + "VFL_CODIGO_BARRIO = ?,"
				+ "VFL_CODIGO_ZONA = ?," + "LOCALIZACION_COBAMA = ? ,"
				+ "CAMPO_A1 = null ," + "CORREO_ELECTRONICO = ? ,"
				+ "ETNIA = ?, " + "usuario_modifica = ?,"
				+ "terminal_modifica = ?,"
				+ "fecha_modifica = to_date(?,'dd/mm/rrrr') "
				+ " WHERE CODIGO = " + criterea.getCode();

		String strNumeroDocumento = criterea.getNumeroDocumento().toString();
		if (strNumeroDocumento != null) {
			strNumeroDocumento = strNumeroDocumento.trim();
			String strSQL = "SELECT COUNT(NUMERO_DOCUMENTO) "
					+ "FROM TCS_BEN_BENEFICIARIO "
					+ "WHERE TIPO_DOCUMENTO = ? AND NUMERO_DOCUMENTO = ? AND CODIGO <> "
					+ criterea.getCode();

			String parArr2[] = { criterea.getTipoDocumento(),
					strNumeroDocumento };
			ResultSet rst = null;
			rst = cf.getRecordsRset(strSQL, parArr2, conn);
			rst.next();

			if (rst.getInt(1) > 0)
				return -1;
		}
		String strNombre1 = criterea.getNombre1();
		if (strNombre1 != null) {
			strNombre1 = strNombre1.trim();
		}
		String strNombre2 = criterea.getNombre2();
		if (strNombre2 != null) {
			strNombre2 = strNombre2.trim();
		}
		String PrimerApellido = criterea.getPrimerApellido();
		if (PrimerApellido != null) {
			PrimerApellido = PrimerApellido.trim();
		}
		String SegundoApellido = criterea.getSegundoApellido();
		if (SegundoApellido != null) {
			SegundoApellido = SegundoApellido.trim();
		}

		String parArr[] = { criterea.getTipoDocumento(), strNumeroDocumento,
				strNombre1, strNombre2, PrimerApellido, SegundoApellido,
				criterea.getVflComuna(), criterea.getFechaNacimiento(),
				criterea.getSexo(), criterea.getTelefono(),
				criterea.getDirDescriptiva(), criterea.getDirEncasillada(),
				criterea.getCodeBarrio(), criterea.getCodeZona(),
				criterea.getCobama(), criterea.getMail(), criterea.getEtnia(),
				criterea.getUpdateUser(), criterea.getUpdateTerminal(),
				criterea.getUpdateDate() };
		int i = cf.execSql(query, parArr, conn);
		if (i > 0)
			return 1;
		else
			return 0;
	}

	public Collection getCabezasGrupoFamiliar(BeneficiarioVO criterea)
			throws SQLException {
		String query = "SELECT GF.BEN_CODIGO COD_CABEZA, BEN.TIPO_DOCUMENTO, "
				+ "BEN.NUMERO_DOCUMENTO,BEN.PRIMER_NOMBRE, BEN.SEGUNDO_NOMBRE, "
				+ "BEN.PRIMER_APELLIDO, BEN.SEGUNDO_APELLIDO, "
				+ "GF.CODIGO COD_GF, GF.NOMBRE NOM_GF "
				+ "FROM TCS_BEN_GRUPO_FAMILIAR GF, "
				+ "TCS_BEN_BENEFICIARIO BEN "
				+ "WHERE GF.BEN_CODIGO = BEN.CODIGO";

		ArrayList cabezas = new ArrayList();
		if (!criterea.getNumeroDocumento().equalsIgnoreCase("")) {
			query += " AND BEN.NUMERO_DOCUMENTO = '"
					+ criterea.getNumeroDocumento() + "'";
		}
		if (!criterea.getNombre1().equalsIgnoreCase("")) {
			query += " AND UPPER(BEN.PRIMER_NOMBRE) LIKE UPPER('%"
					+ criterea.getNombre1() + "%') ";
		}
		if (!criterea.getPrimerApellido().equalsIgnoreCase("")) {
			query += " AND UPPER(BEN.PRIMER_APELLIDO||' '||BEN.SEGUNDO_APELLIDO) like UPPER('%"
					+ criterea.getPrimerApellido() + "%') ";
		}
		if (criterea.getGrupoFamiliar() != null
				&& !criterea.getGrupoFamiliar().equalsIgnoreCase("")) {
			query += " AND UPPER(GF.NOMBRE) LIKE UPPER('%"
					+ criterea.getGrupoFamiliar() + "%') ";
		}
		// System.out.println(query);
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		BeneficiarioVO bene = null;
		while (rst.next()) {
			bene = new BeneficiarioVO();
			bene.setCode(new Long(rst.getLong("COD_CABEZA")));
			bene.setTipoDocumento(rst.getString("TIPO_DOCUMENTO"));
			bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
			bene.setNombre1(rst.getString("PRIMER_NOMBRE"));
			bene.setNombre2(rst.getString("SEGUNDO_NOMBRE"));
			bene.setPrimerApellido(rst.getString("PRIMER_APELLIDO"));
			bene.setSegundoApellido(rst.getString("SEGUNDO_APELLIDO"));
			bene.setGrupoFamiliarCode(new Long(rst.getLong("COD_GF")));
			bene.setGrupoFamiliar(rst.getString("NOM_GF"));
			cabezas.add(bene);
			bene = null;
		}
		rst.close();

		return cabezas;
	}

	public Collection getGrupoFamiliar(BeneficiarioVO criterea)
			throws SQLException {
		String query = "SELECT ben.codigo CODIGOBENE, ben.numero_documento, ben.PRIMER_NOMBRE, "
				+ "ben.SEGUNDO_NOMBRE,ben.PRIMER_APELLIDO, ben.SEGUNDO_APELLIDO, "
				+ "gf.nombre Nombre_Grupo, vflex.DESCRIPCION PARENTESCO, "
				+ "cabeza.CODIGO COD_CABEZA, cabeza.PRIMER_NOMBRE||' '||cabeza.SEGUNDO_NOMBRE||' '||cabeza.PRIMER_APELLIDO"
				+ "||' '||cabeza.SEGUNDO_APELLIDO NOMBRE_CABEZA, cabeza.NUMERO_DOCUMENTO DOC_CABEZA "
				+ "FROM tcs_ben_beneficiario ben, tcs_ben_grupo_familiar gf, "
				+ "tcs_ben_benef_grupo_familiar bgf, paoyer.tcs_valor_flexible vflex, "
				+ "tcs_ben_beneficiario cabeza "
				+ "WHERE vflex.CODIGO = bgf.VFL_CODIGO_PARENTESCO "
				+ "AND ben.codigo = bgf.ben_codigo AND gf.codigo = bgf.gf_codigo "
				+ "AND ben.CAMPO_A1 IS NULL AND cabeza.CODIGO = gf.BEN_CODIGO ";

		ArrayList beneficiarios = new ArrayList();
		if (criterea.getGrupoFamiliarCode() != null) {
			query += "AND bgf.gf_codigo = " + criterea.getGrupoFamiliarCode();/*
																			 * +
																			 * " AND ben.codigo <> "
																			 * +
																			 * criterea
																			 * .
																			 * getCode
																			 * (
																			 * )
																			 * ;
																			 */

			ResultSet rst = null;
			rst = cf.getRecordsRset(query, null, conn);
			BeneficiarioVO bene = null;
			while (rst.next()) {
				bene = new BeneficiarioVO();
				bene.setCode(new Long(rst.getLong("CODIGOBENE")));
				bene.setNumeroDocumento(rst.getString("NUMERO_DOCUMENTO"));
				bene.setNombre1(rst.getString("PRIMER_NOMBRE"));
				bene.setNombre2(rst.getString("SEGUNDO_NOMBRE"));
				bene.setPrimerApellido(rst.getString("PRIMER_APELLIDO"));
				bene.setSegundoApellido(rst.getString("SEGUNDO_APELLIDO"));
				bene.setGrupoFamiliar(rst.getString("Nombre_Grupo"));
				bene.setParentesco(rst.getString("PARENTESCO"));
				bene.setPoseeBeneficios(getNumberBeneficios(new Long(rst
						.getLong("CODIGOBENE"))));
				bene.setCodeCabezaGF(new Long(rst.getLong("COD_CABEZA")));
				bene.setNombreCabezaGF(rst.getString("NOMBRE_CABEZA"));
				bene.setDocumentoCabezaGF(rst.getString("DOC_CABEZA"));
				beneficiarios.add(bene);
				bene = null;
			}
			rst.close();
		}
		return beneficiarios;
	}

	/**
	 * M�todo para Obtener la edad del beneficiario
	 * 
	 * @param strCodeBeneficiario
	 * @return
	 * @throws java.sql.SQLException
	 */
	public String FindEdad(String strCodeBeneficiario) throws SQLException {
		String strEdad = null;
		String query = "SELECT TRUNC((SYSDATE-fecha_nacimiento)/365) EDAD FROM TCS_BEN_BENEFICIARIO"
				+ "WHERE CODIGO = '" + strCodeBeneficiario + "'";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);

		if (rst.next()) {
			strEdad = rst.getString("EDAD");
		}

		return strEdad;

	}

	public String[] ingresarBeneficiario(BeneficiarioVO criterea)
			throws SQLException {
		String query = "INSERT INTO TCS_BEN_BENEFICIARIO ( "
				+ "CODIGO, NUMERO_DOCUMENTO, TIPO_DOCUMENTO, "
				+ "PRIMER_NOMBRE,SEGUNDO_NOMBRE, PRIMER_APELLIDO, "
				+ "SEGUNDO_APELLIDO, VFL_CODIGO_COMUNA, FECHA_NACIMIENTO, "
				+ "SEXO, TELEFONO, DIRECCION_DESCRIPTIVA, "
				+ "DIRECCION_ENCASILLADA, "
				+ "LOCALIZACION_COBAMA, CAMPO_A1, VFL_CODIGO_BARRIO, VFL_CODIGO_ZONA, CORREO_ELECTRONICO, ETNIA, "
				+ " usuario_crea,terminal_crea, fecha_crea,usuario_modifica,terminal_modifica,fecha_modifica ) "
				+ "VALUES ( SCS_BEN_BEN.NextVal,?,?,UPPER(?),UPPER(?),UPPER(?),UPPER(?),?,to_date(?,'dd/mm/rrrr'),?,?,?,?,?,null,?,?,?,?,?,?,to_date(?,'dd/mm/rrrr'),?,?,to_date(?,'dd/mm/rrrr'))";

		String strNombre1 = criterea.getNombre1();
		if (strNombre1 != null)
			strNombre1 = strNombre1.trim();

		String strNombre2 = criterea.getNombre2();
		if (strNombre2 != null)
			strNombre2 = strNombre2.trim();

		String strPrimerApellido = criterea.getPrimerApellido();
		if (strPrimerApellido != null)
			strPrimerApellido = strPrimerApellido.trim();

		String strSegundoApellido = criterea.getSegundoApellido();
		if (strSegundoApellido != null)
			strSegundoApellido = strSegundoApellido.trim();

		String strCodeBarrio = criterea.getCodeBarrio();
		if (strCodeBarrio != null)
			strCodeBarrio = strCodeBarrio.trim();

		String strCodeZona = criterea.getCodeZona();
		if (strCodeZona != null)
			strCodeZona = strCodeZona.trim();

		String parArr[] = { criterea.getNumeroDocumento().trim(),
				criterea.getTipoDocumento(), strNombre1, strNombre2,
				strPrimerApellido, strSegundoApellido, criterea.getVflComuna(),
				criterea.getFechaNacimiento(), criterea.getSexo(),
				criterea.getTelefono(), criterea.getDirDescriptiva(),
				criterea.getDirEncasillada(), criterea.getCobama(),
				strCodeBarrio, strCodeZona, criterea.getMail(),
				criterea.getEtnia(), criterea.getCreationUser(),
				criterea.getCreationTerminal(), criterea.getCreationDate(),
				criterea.getUpdateUser(), criterea.getUpdateTerminal(),
				criterea.getUpdateDate() };

		int i = cf.execSql(query, parArr, conn);
		query = "select max(codigo) code FROM TCS_BEN_BENEFICIARIO";
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		String code = "";
		if (rst.next()) {
			code = rst.getString("code");
		}

		String retorno[] = new String[2];
		if (i > 0) {
			retorno[0] = "true";
			retorno[1] = code;
			return retorno;
		} else {
			retorno[0] = "false";
			retorno[1] = code;
			return retorno;
		}
	}

	public String getBeneficios(Long code) throws SQLException {
		String query = "SELECT CODSUBPROG FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBEN = " + code;

		// System.out.println(query);
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			rst.close();
			return "Si";
		} else {
			rst.close();
			return "No";
		}
	}

	/**
	 * M�todo para obtener el n�mero de beneficios Otorgados
	 * 
	 * @param code
	 * @return
	 * @throws java.sql.SQLException
	 */
	public String getNumberBeneficios(Long code) throws SQLException {
		String query = "SELECT COUNT(1) NUMBENE FROM (SELECT SBPR_CODIGO, BEN_CODIGO "
				+ "FROM BENEFICIOS.TCS_BEN_BENEFICIO_OTORGADO beneotorg "
				+ "WHERE to_date(beneotorg.FECHA_BENEFICIO,'dd/mm/rrrr') <= to_date(sysdate,'dd/mm/rrrr') "
				+ "AND beneotorg.BEN_CODIGO = '" + code + "')";

		// System.out.println(query);
		int contador = 0;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			contador = rst.getInt("NUMBENE");
		}
		rst.close();
		return (String.valueOf(contador));
	}

	public String[] getBeneficiosSisben(String documento, String tipoDocumento)
			throws SQLException {
		String query = "SELECT CODBEN FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE TIPODOC = '" + tipoDocumento + "'"
				+ " AND NUMERODOC = '" + documento + "'";

		// System.out.println(query);
		ResultSet rst = null;
		String retorno[] = new String[2];
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			retorno[0] = "Si";
			retorno[1] = rst.getString("CODBEN");
			rst.close();
			return retorno;
		} else {
			retorno[0] = "No";
			retorno[1] = "nulo";
			rst.close();
			return retorno;
		}
	}

	/**
	 * Metodo para calcular el numero de beneficios que tiene una persona que
	 * esta en SISBEN
	 * 
	 * @param documento
	 * @param tipoDocumento
	 * @return
	 * @throws java.sql.SQLException
	 */
	public String getNumberBeneficiosSisben(String documento,
			String tipoDocumento) throws SQLException {

		String query = "SELECT COUNT(1) NUMBEN FROM (SELECT beneotorg.SBPR_CODIGO, beneotorg.BEN_CODIGO "
				+ "FROM TCS_BEN_BENEFICIO_OTORGADO beneotorg, TCS_BEN_BENEFICIARIO bene "
				+ "WHERE bene.CODIGO = beneotorg.BEN_CODIGO "
				+ "AND bene.TIPO_DOCUMENTO = '"
				+ tipoDocumento
				+ "' "
				+ "AND bene.NUMERO_DOCUMENTO = '" + documento + "')";

		ResultSet rst = null;
		int contador = 0;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			contador = rst.getInt("NUMBEN");
		}
		rst.close();
		return (String.valueOf(contador));
	}

	public Collection getBeneficios(BeneficiarioVO criterea)
			throws SQLException {
		String query = "SELECT * FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBEN = " + criterea.getCode();

		BeneficioVO beneficioVO = null;
		ArrayList beneficios = new ArrayList();
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		while (rst.next()) {
			beneficioVO = new BeneficioVO();
			beneficioVO.setCode(new Long(rst.getLong("CODSUBPROG")));
			beneficioVO.setNombre(rst.getString("NOMSUBPROG"));
			beneficioVO.setFecha(rst.getString("FECHA"));
			beneficioVO.setCodSede(new Long(rst.getLong("CODSEDE")));
			beneficioVO.setNomSede(rst.getString("NOMSEDE"));
			beneficioVO.setCodPrograma(new Long(rst.getLong("CODPROG")));
			beneficioVO.setNomPrograma(rst.getString("NOMPROG"));
			beneficioVO.setCodCategoria(new Long(rst.getLong("CODCATEGORIA")));
			beneficioVO.setNomCategoria(rst.getString("NOMCATEGORIA"));
			beneficioVO.setRenovar(rst.getString("RENOVAR"));
			beneficioVO.setDiasReutilizar(rst.getString("DIASREUTILIZAR"));
			beneficioVO.setCodeBot(new Long(rst.getString("CODBOT")));
			beneficios.add(beneficioVO);
			beneficioVO = null;
		}
		rst.close();
		return beneficios;
	}

	public Collection getLastBeneficios(BeneficiarioVO criterea)
			throws SQLException {
		String query = " SELECT bo.*, fcs_ben_getCountValor(bo.CODSUBPROG, bo.CODBEN) ValorBen "
				+ " FROM VCS_BENEFICIOS_OTORGADOS bo "
				+ " WHERE CODBOT in (select max(bot.CODIGO) codigo "
				+ "                from tcs_ben_beneficio_otorgado bot "
				+ "                where to_date(bot.FECHA_BENEFICIO,'dd/mm/rrrr') <= to_date(sysdate,'dd/mm/rrrr') "
				+ "                and bot.BEN_CODIGO ="
				+ criterea.getCode()
				+ "                group by bot.SBPR_CODIGO)";

		BeneficioVO beneficioVO = null;
		ArrayList beneficios = new ArrayList();
		int iTotal = 0;
		int iCount = 0;
		int valor = 0;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		while (rst.next()) {
			beneficioVO = new BeneficioVO();
			beneficioVO.setCode(new Long(rst.getLong("CODSUBPROG")));
			beneficioVO.setNombre(rst.getString("NOMSUBPROG"));
			beneficioVO.setFecha(rst.getString("FECHA"));
			beneficioVO.setCodSede(new Long(rst.getLong("CODSEDE")));
			beneficioVO.setNomSede(rst.getString("NOMSEDE"));
			beneficioVO.setCodPrograma(new Long(rst.getLong("CODPROG")));
			beneficioVO.setNomPrograma(rst.getString("NOMPROG"));
			beneficioVO.setCodCategoria(new Long(rst.getLong("CODCATEGORIA")));
			beneficioVO.setNomCategoria(rst.getString("NOMCATEGORIA"));
			beneficioVO.setRenovar(rst.getString("RENOVAR"));
			beneficioVO.setDiasReutilizar(rst.getString("DIASREUTILIZAR"));
			beneficioVO.setCodeBot(new Long(rst.getString("CODBOT")));
			beneficioVO.setCodeArea(new Long(rst.getString("CODAREA")));
			beneficioVO.setNomArea(rst.getString("NOMAREA"));
			beneficioVO.setValor(rst.getInt("ValorBen"));
			valor += rst.getDouble("ValorBen");
			iCount = getCountBeneficios((rst.getString("CODSUBPROG")),
					(rst.getString("CODBEN")));
			iTotal += iCount;
			beneficioVO.setNumeroBeneficios(iCount);
			beneficios.add(beneficioVO);
			beneficioVO = null;
		}
		if (beneficios != null && beneficios.size() > 0) {
			beneficioVO = new BeneficioVO();
			beneficioVO.setCode(new Long("0"));
			beneficioVO.setNombre("");
			beneficioVO.setFecha("");
			beneficioVO.setCodSede(new Long("0"));
			beneficioVO.setNomSede("");
			beneficioVO.setCodPrograma(new Long("0"));
			beneficioVO.setNomPrograma("");
			beneficioVO.setCodCategoria(new Long("0"));
			beneficioVO.setNomCategoria("");
			beneficioVO.setRenovar("");
			beneficioVO.setDiasReutilizar("");
			beneficioVO.setCodeBot(new Long("0"));
			beneficioVO.setCodeArea(new Long("0"));
			beneficioVO.setNomArea("TOTAL");
			beneficioVO.setNumeroBeneficios(iTotal);
			beneficioVO.setValor(valor);
			beneficios.add(beneficioVO);
		}
		rst.close();
		return beneficios;
	}

	public int getCountBeneficios(String strCodeSub, String strCodeBene)
			throws SQLException {
		String strSql = "select count(1) total "
				+ "from tcs_ben_beneficio_otorgado bot "
				+ "where to_date(bot.FECHA_BENEFICIO,'dd/mm/rrrr') <= to_date(sysdate,'dd/mm/rrrr') "
				+ "and bot.BEN_CODIGO = ? " + "and bot.SBPR_CODIGO = ? ";
		String strPar1[] = { strCodeBene, strCodeSub };
		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, strPar1, conn);
		int iTotal = 0;
		if (rst.next()) {
			iTotal = rst.getInt("total");
		}
		return iTotal;
	}

	public boolean eliminarBeneficiario(Long beneficiarioCode, String user,
			String terminal, String fecha) {
		String query = "UPDATE TCS_BEN_BENEFICIARIO SET CAMPO_A1 = 'S', "
				+ "usuario_modifica = '" + user + "',"
				+ "terminal_modifica = 'WEB=" + terminal + "',"
				+ "fecha_modifica = to_date('" + fecha + "','dd/mm/rrrr') "
				+ "WHERE CODIGO = " + beneficiarioCode;
		try {
			int iregAfect = cf.execSql(query, null, conn);
			// boolean q
			if (iregAfect > 0)
				return true;
			else
				return false;

		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSSPE - cwsub ********/");
			return false;
		}
	}

	public boolean eliminarBeneficio(Long beneficiarioCode, Long beneficioCode,
			String user, String terminal, String fecha) throws SQLException {
		boolean retorno = false;
		if (beneficiarioCode != null && beneficioCode != null) {
			String query = "select codigo from TCS_BEN_BENEFICIO_OTORGADO where SBPR_CODIGO = "
					+ beneficioCode + " and BEN_CODIGO = " + beneficiarioCode;
			// System.out.println(query);
			ResultSet rs = cf.getRecordsRset(query, null, conn);
			while (rs.next()) {
				retorno = true;
				query = "update TCS_BEN_BENEFICIO_OTORGADO set campo_a1 = 'E', "
						+ "usuario_modifica = '"
						+ user
						+ "',"
						+ "terminal_modifica = 'WEB="
						+ terminal
						+ "',"
						+ "fecha_modifica = to_date('"
						+ fecha
						+ "','dd/mm/rrrr') "
						+ " where codigo = "
						+ rs.getLong("codigo");
				// System.out.println(query);
				int iReg = cf.execSql(query, null, conn);
				conn.commit();
			}
		}

		return retorno;

		// / MANERA DE BORRAR FISICAMENTE TODO ///

		/*
		 * String query =
		 * "DELETE FROM TCS_BEN_BENEFICIARIO_ATRIBUTO WHERE BEN_CODIGO = "
		 * +beneficiarioCode;
		 * 
		 * try { conn.setAutoCommit(false); int iregAfect =
		 * cf.execSql(query,null,conn); query = "SELECT CODIGO BOTCODIGO "+
		 * "FROM TCS_BEN_BENEFICIO_OTORGADO "+
		 * "WHERE SBPR_CODIGO = "+beneficioCode+
		 * " AND BEN_CODIGO = "+beneficiarioCode+
		 * " AND SEDE_CODIGO = "+sedeCode; //System.out.println(query);
		 * ResultSet rst = null; rst = cf.getRecordsRset(query,null,conn); if (
		 * rst.next() ) { Long botCodigo = new Long(rst.getLong("BOTCODIGO"));
		 * query =
		 * "DELETE	FROM TCS_BEN_BENEFICIO_ATRIBUTO WHERE BOT_CODIGO = "+botCodigo
		 * ; //System.out.println(query); iregAfect =
		 * cf.execSql(query,null,conn); rst.close(); query = "DELETE "+
		 * "FROM TCS_BEN_BENEFICIO_OTORGADO "+
		 * "WHERE SBPR_CODIGO = "+beneficioCode+
		 * " AND BEN_CODIGO = "+beneficiarioCode+
		 * " AND SEDE_CODIGO = "+sedeCode; //System.out.println(query);
		 * iregAfect = cf.execSql(query,null,conn); conn.commit();
		 * conn.setAutoCommit(true); } return true; }catch(SQLException e) {
		 * try{ conn.rollback(); conn.setAutoCommit(true); }catch(SQLException
		 * e1) { e1.printStackTrace(); } return false; }
		 */

	}

	public boolean asignarGrupoFamiliar(Long codeBene, Long codeGF,
			Long codeParentesco, String user, String terminal, String fecha)
			throws SQLException {
		String query = "INSERT INTO TCS_BEN_BENEF_GRUPO_FAMILIAR "
				+ "(CODIGO, GF_CODIGO, BEN_CODIGO,VFL_CODIGO_PARENTESCO, "
				+ "usuario_crea,terminal_crea, fecha_crea,usuario_modifica,terminal_modifica,fecha_modifica) "
				+ "VALUES (SCS_BEN_BGF.NextVal," + codeGF + "," + codeBene
				+ "," + codeParentesco + ",'" + user + "','" + terminal
				+ "',to_date('" + fecha + "','dd/mm/rrrr'),'" + user + "','"
				+ terminal + "',to_date('" + fecha + "','dd/mm/rrrr'))";
		// System.out.println(query);
		int i = cf.execSql(query, null, conn);
		if (i > 0)
			return true;
		else
			return false;
	}

	public String[] insertarGrupoFamiliar(Long codeCabeza, String strNombre,
			Long codeParentesco, String user, String terminal, String fecha)
			throws SQLException {
		String query = "INSERT INTO TCS_BEN_GRUPO_FAMILIAR "
				+ "(CODIGO, BEN_CODIGO,NOMBRE,CODIGO_USUARIO, "
				+ "usuario_crea,terminal_crea, fecha_crea,usuario_modifica,terminal_modifica,fecha_modifica) "
				+ "VALUES (SCS_BEN_GF.NextVal," + codeCabeza + ",'GF-"
				+ strNombre + "','GF-" + strNombre + "','" + user + "','"
				+ terminal + "',to_date('" + fecha + "','dd/mm/rrrr'),'" + user
				+ "','" + terminal + "',to_date('" + fecha + "','dd/mm/rrrr'))";
		int i = cf.execSql(query, null, conn);
		String retorno[] = new String[2];
		if (i > 0) {
			query = "select max(codigo) code FROM TCS_BEN_GRUPO_FAMILIAR";
			ResultSet rst = null;
			rst = cf.getRecordsRset(query, null, conn);
			Long code = null;
			if (rst.next()) {
				code = new Long(rst.getString("code"));
				retorno[1] = code.toString();
				query = "INSERT INTO TCS_BEN_BENEF_GRUPO_FAMILIAR "
						+ "(CODIGO, GF_CODIGO, BEN_CODIGO,VFL_CODIGO_PARENTESCO) "
						+ "VALUES (SCS_BEN_BGF.NextVal," + code + ","
						+ codeCabeza + "," + codeParentesco + ")";

				i = cf.execSql(query, null, conn);
				if (i > 0) {
					retorno[0] = "true";
				} else {
					retorno[0] = "false";
				}
			}
		}
		return retorno;
	}

	/**
	 * M�todo que retorna el c�digo m�ximo de la tabla
	 * TCS_BEN_GRUPO_FAMILIAR
	 * 
	 * @return
	 * @throws java.sql.SQLException
	 */
	public String FindMaxCodeGrupoFamiliar() throws SQLException {
		String query = "select max(codigo) MaxCode FROM TCS_BEN_GRUPO_FAMILIAR";
		String strMaxCode = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strMaxCode = rst.getString("MaxCode");
		}
		rst.close();
		return strMaxCode;
	}

	/**
	 * M�todo para consultar si un beneficiario esta en la tabla
	 * TCS_BEN_BENEF_GRUPO_FAMILIAR
	 * 
	 * @param lnCodeBene
	 * @param strCodeGrupo
	 * @return
	 * @throws java.sql.SQLException
	 */
	public boolean FindBeneAssigned(Long lnCodeBene, String strCodeGrupo)
			throws SQLException {
		String query = "SELECT CODIGO, GF_CODIGO, BEN_CODIGO, VFL_CODIGO_PARENTESCO "
				+ "FROM TCS_BEN_BENEF_GRUPO_FAMILIAR "
				+ "WHERE BEN_CODIGO = '"
				+ lnCodeBene + "' " + "AND GF_CODIGO = '" + strCodeGrupo + "'";

		boolean bSearch = false;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			bSearch = true;
		}
		rst.close();
		return bSearch;
	}

	public Connection getConn() {
		return conn;
	}

	// Felipe
	public String getSubProGrupoFam(Long codeSubpro) throws SQLException {
		String query = "SELECT GRUPO_FAMILIAR FROM TCS_BEN_SUBPROGRAMA "
				+ "WHERE CODIGO = " + codeSubpro + " "
				+ "AND GRUPO_FAMILIAR='S' ";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			rst.close();
			return "Si";
		} else {
			rst.close();
			return "No";
		}
	}

	public String getBeneficiosGrupoFam(Long code, Long codeSubpro)
			throws SQLException {
		String query = "SELECT * FROM VCS_BENEFICIOS_OTORGADOS "
				+ "WHERE CODBEN = " + code + " " + "AND CODSUBPROG="
				+ codeSubpro + " ";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			rst.close();
			return "Si";
		} else {
			rst.close();
			return "No";
		}
	}

	public String getCodeBenBOT(String codeBOT) throws SQLException {
		String query = " SELECT BEN_CODIGO "
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO " + " WHERE codigo ="
				+ codeBOT;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);

		rst.next();

		return rst.getString("BEN_CODIGO");
	}
	
	/**
	 * Mapea la fila actual de un ResultSet a un BeneficiarioVO.
	 * 
	 * @param resultSet
	 *            El ResultSet con la fila actual para ser mapeada en el BeneficiarioVO.
	 * @return El BeneficiarioVO mapeado desde la fila actual del ResultSet.
	 * @throws SQLException
	 *             Si algo falla a nivel de base de datos.
	 */
	private static BeneficiarioVO mapSisben(ResultSet resultSet) throws SQLException {
		BeneficiarioVO beneficiarioVO = new BeneficiarioVO();
		
		beneficiarioVO.setNombre1(resultSet.getString("NOM1"));
		beneficiarioVO.setNombre2(resultSet.getString("NOM2"));
		beneficiarioVO.setPrimerApellido(resultSet.getString("APE1"));
		beneficiarioVO.setSegundoApellido(resultSet.getString("APE2"));
		beneficiarioVO.setTipoDocumento(resultSet.getString("TIPODOC"));
		beneficiarioVO.setNumeroDocumento(resultSet.getString("DOCUMENT"));
		beneficiarioVO.setTelefono(resultSet.getString("TELES"));
		beneficiarioVO.setSexo(resultSet.getString("SEXO"));
		beneficiarioVO.setFechaNacimientoDate(resultSet.getDate("FECHANTO"));
		//FORMATEA LA FECHA EN EL ESTILO DD/MM/YYYY
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
		String sdate = formatter.format(beneficiarioVO.getFechaNacimientoDate());
		beneficiarioVO.setFechaNacimiento(sdate);
		beneficiarioVO.setDirDescriptiva(resultSet.getString("DIRECC"));
//		beneficiarioVO.setMail(resultSet.getString("DIRECC"));

		return beneficiarioVO;
	}

	/*
	 * public static void main(String[] args) {
	 * 
	 * ConnectionFactory cf = new ConnectionFactory("beneficios","beneficios");
	 * BeneficiarioVO objBeneVO = new BeneficiarioVO();
	 * objBeneVO.setNumeroDocumento("42780932");
	 * //objBeneVO.setTipoDocumento("C"); //objBeneVO.setNombre1("RUTH");
	 * objBeneVO.setNombre2("orfilia"); //objBeneVO.setPrimerApellido("GOMEZ");
	 * objBeneVO.setSegundoApellido("ZABALA");
	 * objBeneVO.setFechaNacimiento("06/08/1969"); BeneficiarioDAO objBeneDAO;
	 * Collection beneficiarios=null; try { objBeneDAO = new
	 * BeneficiarioDAO(cf); beneficiarios =
	 * objBeneDAO.findBeneficiarioSisben(objBeneVO); if (beneficiarios.size() >
	 * 0) System.out.println("Se econtro");
	 * cf.closeConnection(objBeneDAO.getConn());
	 * 
	 * }catch(SQLException e){ e.printStackTrace(); }
	 * 
	 * //System.out.println(o[1].toString()); }
	 */

}